﻿using System;
using System.Collections.Generic;
using Wedn.Core.Common;
using Wedn.Core.Entity;
using Wedn.Core.Utility;

namespace Wedn.Core.Service
{
    /// <summary>
    /// 文章管理类
    /// </summary>
    public class PostManager
    {
        private Wedn.Interface.DAL.IPost dao;
        /// <summary>
        /// 文章管理类构造函数
        /// </summary>
        /// <exception cref="未找到系统数据库访问组件"></exception>
        public PostManager()
        {
            dao = Wedn.Interface.DAOFactory.CreatePostDAOInstance();
            if (dao == null)
            {
                throw new System.Exception("缺失数据库访问组件!");
            }
            //LoadStaticPost();
        }

        /// <summary>
        /// 检查表中是否已经存在该别名, 返回一个布尔值, 存在则为True; 不存在则为False
        /// </summary>
        /// <param name="slug">要确定的别名</param>
        /// <returns>存在返回True; 不存在返回False</returns>
        public bool ExistsSlug(string slug)
        {
            return dao.ExistsSlug(slug);
        }

        /// <summary>
        /// 选取文章信息表中文章总数
        /// </summary>
        /// <param name="where">选择条件</param>
        /// <returns>总数</returns>
        public int GetPostsCount(string where)
        {
            return dao.SelectPostsCount(where);
        }

        /// <summary>
        /// 选取文章信息表中所有文章信息, 返回文章信息对象集合, 如果不存在则返回空集合
        /// </summary>
        /// <returns>所有文章信息集合</returns>
        public List<Post> GetPostList()
        {
            List<Post> list = dao.SelectPostList();
            if (list == null)
                list = new List<Post>();
            return list;
        }

        /// <summary>
        /// 根据指定状态, 指定浏览等级, 指定页码, 和页面大小 按照指定字段和排序规则排列
        /// 从文章信息表中选取指定条数文章信息
        /// 如果指定int类型参数传入-1, string传入null, 则表示忽略该检索条件
        /// 将默认按照更新时间降序排序, 返回文章信息对象集合, , 如果不存在则返回空集合(简化版)
        /// </summary>
        /// <param name="status">文章当前状态</param>
        /// <param name="type">文章类型</param>
        /// <param name="pageSize">文章数目</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="orderField">排序字段</param>
        /// <param name="order">排序方式(0:降序(desc)|1:升序(asc))</param>
        /// <returns>符合条件文章信息对象集合, 如果不存在则返回空集合</returns>
        public List<Post> GetPostList(PostStatus status, PostType type, int pageSize, int pageIndex, string orderField, int order)
        {
            List<Post> list = dao.SelectPostList((int)status, (int)type, pageSize, pageIndex, orderField, order);
            if (list == null)
                list = new List<Post>();
            //posts = list;
            return list;
        }

        /// <summary>
        /// 根据指定关键词, 状态, 浏览等级, 类别ID, 用户ID, 开始时间, 结束时间, 指定页码, 和页面大小 按照指定字段和排序规则排列
        /// 从文章信息表中选取指定条数文章信息
        /// 如果指定int类型参数传入-1, string传入null, 则表示忽略该检索条件
        /// 将默认按照更新时间降序排序, 返回文章信息对象集合 , 如果不存在则返回空集合
        /// </summary>
        /// <param name="keyword">关键词(忽略该条件则传入null)</param>
        /// <param name="status">文章当前状态</param>
        /// <param name="type">文章类型(0:Post, 1:Page, 2:Media...)(忽略该条件则传入-1)</param>
        /// <param name="categoryId">类别ID(忽略该条件则传入-1)</param>
        /// <param name="userId">用户ID(忽略该条件则传入-1)</param>
        /// <param name="beginDate">起始日期(忽略该条件则传入null)</param>
        /// <param name="endDate">截至日期(忽略该条件则传入null)</param>
        /// <param name="pageSize">每页显示条数</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="orderField">排序字段</param>
        /// <param name="order">排序方式(0:降序(desc)|1:升序(asc))</param>
        /// <param name="recordCount">返回查询到的记录数</param>
        /// <returns>多条文章信息集合 , 如果不存在则返回空集合</returns>
        public List<Post> GetPostList(string keyword, PostStatus status, PostType type, int categoryId, int userId, string beginDate, string endDate, int pageSize, int pageIndex, string orderField, int order, out int recordCount)
        {
            List<Post> list = dao.SelectPostList(keyword, (int)status, (int)type, categoryId, userId, beginDate, endDate, pageSize, pageIndex, orderField, order, out recordCount);
            if (list == null)
                list = new List<Post>();
            return list;
        }

        /// <summary>
        /// 根据文章归档年月选取文章信息集合默认按照更新时间降序排序, 返回对象集合, 如果不存在则返回空集合
        /// </summary>
        /// <param name="beginDate">开始时间</param>
        /// <param name="endDate">结束时间</param>
        /// <param name="status">文章当前状态</param>
        /// <returns>多条文章信息集合, 如果不存在则返回空集合</returns>
        public List<Post> GetPostList(string beginDate, string endDate, PostStatus status)
        {
            List<Post> list = dao.SelectPostList(beginDate, endDate, (int)status);
            if (list == null)
                list = new List<Post>();
            return list;
        }

        /// <summary>
        /// 根据用户ID选取文章信息集合默认按照更新时间降序排序, 返回对象集合, 如果不存在则返回空集合
        /// </summary>
        /// <param name="userid">用户ID</param>
        /// <returns>多条文章信息集合, 如果不存在则返回空集合</returns>
        public List<Post> GetPostList(int userid)
        {
            List<Post> list = dao.SelectPostList(userid);
            if (list == null)
                list = new List<Post>();
            return list;
        }

        /// <summary>
        /// 根据ID数组批量获取文章信息集合, 返回对象集合, 如果不存在则返回空集合
        /// </summary>
        /// <param name="ids">文章ID数组</param>
        /// <param name="status">文章当前状态</param>
        /// <returns>多条文章信息集合, 如果不存在则返回空集合</returns>
        public List<Post> GetPostList(int[] ids, PostStatus status)
        {
            List<Post> list = dao.SelectPostList(ids, (int)status);
            if (list == null)
                list = new List<Post>();
            return list;
        }

        /// <summary>
        /// 选取文章上一篇和下一篇文章对象, 返回对象集合, 如果不存在则返回null
        /// </summary>
        /// <returns>长度为2的文章对象集合,0为上一篇, 1为下一篇 不存在则返回NULL</returns>
        //public Post[] GetPreviousAndNext(Post current)
        //{
        //    return dao.SelectPreviousAndNext(current);
        //}

        /// <summary>
        /// 选取文章归档信息集合, 返回对象集合, 如果不存在则返回空集合
        /// </summary>
        /// <returns>文章归档信息集合, 如果不存在则返回空集合</returns>
        public List<Archive> GetArchiveList()
        {
            List<Archive> list = dao.SelectArchiveList();
            if (list == null)
                list = new List<Archive>();
            return list;
        }

        /// <summary>
        /// 根据文章ID选取文章信息对象, 返回文章信息对象, 不存在则返回NULL
        /// </summary>
        /// <param name="id">文章ID</param>
        /// <returns>文章对象, 不存在则返回NULL</returns>
        public Post GetPost(int id)
        {
            return dao.SelectPost(id);
        }

        /// <summary>
        /// 根据文章Slug选取文章信息对象, 返回文章信息对象, 不存在则返回NULL
        /// </summary>
        /// <param name="slug">文章Sulg</param>
        /// <returns>文章对象, 不存在则返回NULL</returns>
        public Post GetPost(string slug)
        {
            return dao.SelectPost(slug);
        }

        /// <summary>
        /// 向文章表中插入一行数据, 返回插入数据的主键ID, 插入失败返回-1
        /// </summary>
        /// <param name="post">要插入的文章对象</param>
        /// <returns>返回插入数据的主键ID, 插入失败返回-1</returns>
        public int Insert(Post post)
        {
            string p = post.Slug;
            int n = 2;
            while (ExistsSlug(post.Slug))
            {
                post.Slug = p + "-" + n;
                n++;
            }
            return dao.Insert(post);
        }

        /// <summary>
        /// 根据文章ID删除对应文章表中的文章记录, 返回执行结果是否成功
        /// </summary>
        /// <param name="id">要删除的文章ID</param>
        /// <param name="deleteComment">是否删除该文章对应所有评论</param>
        /// <returns>执行结果是否成功</returns>
        public bool Delete(int id, bool deleteComment)
        {
            return dao.Delete(id, deleteComment) > 0;
        }

        /// <summary>
        /// 根据文章ID数组删除对应文章表中的文章记录, 返回执行结果是否成功
        /// </summary>
        /// <param name="ids">要删除的文章ID数组</param>
        /// <param name="deleteComment">是否删除该文章对应所有评论</param>
        /// <returns>执行结果是否成功</returns>
        public bool Delete(int[] ids, bool deleteComment)
        {
            return dao.Delete(ids, deleteComment) > 0;
        }

        /// <summary>
        /// 更新一个完整文章对象, 返回执行结果是否成功
        /// </summary>
        /// <param name="post">更新的对象</param>
        /// <returns>执行结果是否成功</returns>
        public bool UpdatePost(Post post)
        {
            return dao.UpdatePost(post) > 0;
        }

        /// <summary>
        /// 根据文章ID数组批量更新文章状态, 返回执行结果是否成功
        /// </summary>
        /// <param name="ids">要更新的文章ID数组</param>
        /// <param name="status">文章当前状态(0:公开, 1:加密, 2:私密, 3:继承, 4:草稿, 5:自动草稿, 6:回收站...)(忽略该条件则传入-1)</param>
        /// <returns>执行结果是否成功</returns>
        public bool UpdateStatus(int[] ids, PostStatus status)
        {
            return dao.UpdateStatus(ids, (int)status) > 0;
        }

        /// <summary>
        /// 根据文章ID更新文章标题,副标题,别名,内容, 返回执行结果是否成功
        /// </summary>
        /// <param name="id">要更新的文章ID</param>
        /// <param name="title">更新的标题(不更新则传入null)</param>
        /// <param name="subTitle">更新的副标题(不更新则传入null)</param>
        /// <param name="slug">更新的别名(不更新则传入null)</param>
        /// <param name="content">更新的内容(不更新则传入null)</param>
        /// <param name="excerpt">更新的摘要(不更新则传入null)</param>
        /// <returns>执行结果是否成功</returns>
        public bool UpdateInfo(int id, string title, string subTitle, string slug, string content, string excerpt)
        {
            return dao.UpdateInfo(id, title, subTitle, slug, content, excerpt) > 0;
        }

        /// <summary>
        /// 根据文章ID更新文章浏览次数, 返回执行结果是否成功
        /// </summary>
        /// <param name="id">要更新的文章ID</param>
        /// <param name="addCount">增加的数量(一般为1)</param>
        /// <returns>执行结果是否成功</returns>
        public bool UpdateViewCount(int id, int addCount)
        {
            return dao.UpdateViewCount(id, addCount) > 0;
        }

        /// <summary>
        /// 根据文章ID更新文章浏览次数, 返回执行结果是否成功
        /// </summary>
        /// <param name="id">要更新的文章ID</param>
        /// <param name="addCount">增加的数量(一般为1)</param>
        /// <returns>执行结果是否成功</returns>
        public bool UpdateCommentCount(int id, int addCount)
        {
            return dao.UpdateCommentCount(id, addCount) > 0;
        }

        /// <summary>
        /// 获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        public int GetMaxId()
        {
            return dao.SelectMaxId();
        }
    }
}